package com.sysef.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import com.sysef.exception.DAOExcepcion;
import com.sysef.modelo.BeanEstado;
import com.sysef.modelo.BeanTipoUsuario;
import com.sysef.modelo.BeanUsuario;
import com.sysef.modelo.BeanTipoDocumento;
import com.sysef.util.ConexionBD;

public class DAOUsuario extends BaseDAO {

	public Collection<BeanUsuario> buscarPorNombre(String nombre)
			throws DAOExcepcion {
		String query = "select * id from tb_usuario where nombre like ?";
		Collection<BeanUsuario> listBeanUsuario = new ArrayList<BeanUsuario>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			
			while (rs.next()) {
				
				BeanUsuario objBeanUsuario = new BeanUsuario();
				objBeanUsuario.setIntIdUsuario(rs.getInt("idUsuario"));
				objBeanUsuario.setStrNombreUsuario(rs.getString("nombreUsuario"));
				objBeanUsuario.setStrApePaterno(rs.getString("apePaterno"));
				objBeanUsuario.setStrApeMaterno(rs.getString("apeMaterno"));
				objBeanUsuario.setStrSexoUsuario(rs.getString("sexoUsuario"));
				objBeanUsuario.setStrNumDocuUsuario(rs.getString("numDocuUsuario"));
				objBeanUsuario.setStrTelefonoUsuario(rs.getString("telefonoUsuario"));
				objBeanUsuario.setStrDireccionUsuario(rs.getString("direccionUsuario"));
				objBeanUsuario.setStrEmailUsuario(rs.getString("emailUsuario"));
				objBeanUsuario.setStrPasswordUsuario(rs.getString("passwordUsuario"));
				
				//Declaramos una variable que reciba el codigo de tipo de documento
				Integer intIdTipoDocumento;
				//Seteamos la variable con lo recibido en la consulta
				intIdTipoDocumento = rs.getInt("idTipoDoc");
				//Creamos un objeto tipo BeanTipoDocumento 
				BeanTipoDocumento objBeanTipoDocumento= new BeanTipoDocumento();
				//Seteamos el idTipoDocumento dentro del objeto.
				objBeanTipoDocumento.setIntIdTipoDocumento(intIdTipoDocumento);
				//Seteamos el objeto para el objBeanUsuario
				objBeanUsuario.setObjBeanTipoDocu(objBeanTipoDocumento);
				
				//Declaramos una variable que reciba el codigo de estado
				Integer intIdEstado;
				//Seteamos la variable con lo recibido en la consulta
				intIdEstado = rs.getInt("idEstado");
				//Creamos un objeto tipo BeanEstado
				BeanEstado objBeanEstado= new BeanEstado();
				//Seteamos el idEstado dentro del objeto.
				objBeanEstado.setIntIdEstado(intIdEstado);
				//Seteamos el objeto para el objBeanUsuario
				objBeanUsuario.setObjBeanEstado(objBeanEstado);
				
				//Declaramos una variable que reciba el codigo de tipo usuario
				Integer intIdTipoUsuario;
				//Seteamos la variable con lo recibido en la consulta
				intIdTipoUsuario = rs.getInt("idTipoUsuario");
				//Creamos un objeto tipo BeanTipoUsuario
				BeanTipoUsuario objBeanTipoUsuario= new BeanTipoUsuario();
				//Seteamos el idTipoUsuario dentro del objeto.
				objBeanTipoUsuario.setIntTipoUsuario(intIdTipoUsuario);
				//Seteamos el objeto para el objBeanUsuario
				objBeanUsuario.setObjBeanTipoUsuario(objBeanTipoUsuario);
				
				listBeanUsuario.add(objBeanUsuario);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(listBeanUsuario.size());
		return listBeanUsuario;
	}

	public BeanUsuario insertar(BeanUsuario objBeanUsuario) throws DAOExcepcion {
		String query = "insert into tb_usuario(nombreUsuario, apePaterno, apeMaterno, sexoUsuario, numDocuUsuario, telefonoUsuario, direccionUsuario, emailUsuario, passwordUsuario, idTipoDoc, idEstado, idTipoUsuario) values (?,?,?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, objBeanUsuario.getStrNombreUsuario());
			stmt.setString(2, objBeanUsuario.getStrApePaterno());
			stmt.setString(3, objBeanUsuario.getStrApeMaterno());
			stmt.setString(4, objBeanUsuario.getStrSexoUsuario());
			stmt.setString(5, objBeanUsuario.getStrNumDocuUsuario());
			stmt.setString(6, objBeanUsuario.getStrTelefonoUsuario());
			stmt.setString(7, objBeanUsuario.getStrDireccionUsuario());
			stmt.setString(8, objBeanUsuario.getStrEmailUsuario());
			stmt.setString(9, objBeanUsuario.getStrPasswordUsuario());
			stmt.setInt(10, objBeanUsuario.getObjBeanTipoDocu().getIntIdTipoDocumento());
			stmt.setInt(11, objBeanUsuario.getObjBeanEstado().getIntIdEstado());
			stmt.setInt(12, objBeanUsuario.getObjBeanTipoUsuario().getIntTipoUsuario());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			objBeanUsuario.setIntIdUsuario(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return objBeanUsuario;
	}

	public BeanUsuario obtener(int intIdUsuario) throws DAOExcepcion {
		BeanUsuario objBeanUsuario = new BeanUsuario();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select * from tb_usuario where idUsuario=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, intIdUsuario);
			rs = stmt.executeQuery();
			if (rs.next()) {
				objBeanUsuario.setIntIdUsuario(rs.getInt("idUsuario"));
				objBeanUsuario.setStrNombreUsuario(rs.getString("nombreUsuario"));
				objBeanUsuario.setStrApePaterno(rs.getString("apePaterno"));
				objBeanUsuario.setStrApeMaterno(rs.getString("apeMaterno"));
				objBeanUsuario.setStrSexoUsuario(rs.getString("sexoUsuario"));
				objBeanUsuario.setStrNumDocuUsuario(rs.getString("numDocuUsuario"));
				objBeanUsuario.setStrTelefonoUsuario(rs.getString("telefonoUsuario"));
				objBeanUsuario.setStrDireccionUsuario(rs.getString("direccionUsuario"));
				objBeanUsuario.setStrEmailUsuario(rs.getString("emailUsuario"));
				objBeanUsuario.setStrPasswordUsuario(rs.getString("passwordUsuario"));
				
				//Declaramos una variable que reciba el codigo de tipo de documento
				Integer intIdTipoDocumento;
				//Seteamos la variable con lo recibido en la consulta
				intIdTipoDocumento = rs.getInt("idTipoDoc");
				//Creamos un objeto tipo BeanTipoDocumento 
				BeanTipoDocumento objBeanTipoDocumento= new BeanTipoDocumento();
				//Seteamos el idTipoDocumento dentro del objeto.
				objBeanTipoDocumento.setIntIdTipoDocumento(intIdTipoDocumento);
				//Seteamos el objeto para el objBeanUsuario
				objBeanUsuario.setObjBeanTipoDocu(objBeanTipoDocumento);
				
				//Declaramos una variable que reciba el codigo de estado
				Integer intIdEstado;
				//Seteamos la variable con lo recibido en la consulta
				intIdEstado = rs.getInt("idEstado");
				//Creamos un objeto tipo BeanEstado
				BeanEstado objBeanEstado= new BeanEstado();
				//Seteamos el idEstado dentro del objeto.
				objBeanEstado.setIntIdEstado(intIdEstado);
				//Seteamos el objeto para el objBeanUsuario
				objBeanUsuario.setObjBeanEstado(objBeanEstado);
				
				//Declaramos una variable que reciba el codigo de tipo usuario
				Integer intIdTipoUsuario;
				//Seteamos la variable con lo recibido en la consulta
				intIdTipoUsuario = rs.getInt("idTipoUsuario");
				//Creamos un objeto tipo BeanTipoUsuario
				BeanTipoUsuario objBeanTipoUsuario= new BeanTipoUsuario();
				//Seteamos el idTipoUsuario dentro del objeto.
				objBeanTipoUsuario.setIntTipoUsuario(intIdTipoUsuario);
				//Seteamos el objeto para el objBeanUsuario
				objBeanUsuario.setObjBeanTipoUsuario(objBeanTipoUsuario);
							}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return objBeanUsuario;
	}
	
	public BeanUsuario obtenerXDNI(String strDNIUsuario) throws DAOExcepcion {
		BeanUsuario objBeanUsuario = new BeanUsuario();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select * from tb_usuario where numdocuUsuario=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, strDNIUsuario);
			rs = stmt.executeQuery();
			if (rs.next()) {
				objBeanUsuario.setIntIdUsuario(rs.getInt("idUsuario"));
				objBeanUsuario.setStrNombreUsuario(rs.getString("nombreUsuario"));
				objBeanUsuario.setStrApePaterno(rs.getString("apePaterno"));
				objBeanUsuario.setStrApeMaterno(rs.getString("apeMaterno"));
				objBeanUsuario.setStrSexoUsuario(rs.getString("sexoUsuario"));
				objBeanUsuario.setStrNumDocuUsuario(rs.getString("numDocuUsuario"));
				objBeanUsuario.setStrTelefonoUsuario(rs.getString("telefonoUsuario"));
				objBeanUsuario.setStrDireccionUsuario(rs.getString("direccionUsuario"));
				objBeanUsuario.setStrEmailUsuario(rs.getString("emailUsuario"));
				objBeanUsuario.setStrPasswordUsuario(rs.getString("passwordUsuario"));
				
				//Declaramos una variable que reciba el codigo de tipo de documento
				Integer intIdTipoDocumento;
				//Seteamos la variable con lo recibido en la consulta
				intIdTipoDocumento = rs.getInt("idTipoDoc");
				//Creamos un objeto tipo BeanTipoDocumento 
				BeanTipoDocumento objBeanTipoDocumento= new BeanTipoDocumento();
				//Seteamos el idTipoDocumento dentro del objeto.
				objBeanTipoDocumento.setIntIdTipoDocumento(intIdTipoDocumento);
				//Seteamos el objeto para el objBeanUsuario
				objBeanUsuario.setObjBeanTipoDocu(objBeanTipoDocumento);
				
				//Declaramos una variable que reciba el codigo de estado
				Integer intIdEstado;
				//Seteamos la variable con lo recibido en la consulta
				intIdEstado = rs.getInt("idEstado");
				//Creamos un objeto tipo BeanEstado
				BeanEstado objBeanEstado= new BeanEstado();
				//Seteamos el idEstado dentro del objeto.
				objBeanEstado.setIntIdEstado(intIdEstado);
				//Seteamos el objeto para el objBeanUsuario
				objBeanUsuario.setObjBeanEstado(objBeanEstado);
				
				//Declaramos una variable que reciba el codigo de tipo usuario
				Integer intIdTipoUsuario;
				//Seteamos la variable con lo recibido en la consulta
				intIdTipoUsuario = rs.getInt("idTipoUsuario");
				//Creamos un objeto tipo BeanTipoUsuario
				BeanTipoUsuario objBeanTipoUsuario= new BeanTipoUsuario();
				//Seteamos el idTipoUsuario dentro del objeto.
				objBeanTipoUsuario.setIntTipoUsuario(intIdTipoUsuario);
				//Seteamos el objeto para el objBeanUsuario
				objBeanUsuario.setObjBeanTipoUsuario(objBeanTipoUsuario);
							}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return objBeanUsuario;
	}
	
	public void eliminar(int intIdUsuario) throws DAOExcepcion {
		String query = "update tb_usuario set idEstado=2 WHERE idUsuario=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, intIdUsuario);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public BeanUsuario actualizar(BeanUsuario objBeanUsuario) throws DAOExcepcion {
		String query = "update tb_usuario set nombreUsuario=?, apePaterno=?, apeMaterno=?, sexoUsuario=?, numDocuUsuario=?, telefonoUsuario=?, direccionUsuario=?, emailUsuario=?, passwordUsuario=?, idTipoDoc=?, idEstado=?, idTipoUsuario=? where idUsuario=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, objBeanUsuario.getStrNombreUsuario());
			stmt.setString(2, objBeanUsuario.getStrApePaterno());
			stmt.setString(3, objBeanUsuario.getStrApeMaterno());
			stmt.setString(4, objBeanUsuario.getStrSexoUsuario());
			stmt.setString(5, objBeanUsuario.getStrNumDocuUsuario());
			stmt.setString(6, objBeanUsuario.getStrTelefonoUsuario());
			stmt.setString(7, objBeanUsuario.getStrDireccionUsuario());
			stmt.setString(8, objBeanUsuario.getStrEmailUsuario());
			stmt.setString(9, objBeanUsuario.getStrPasswordUsuario());
			stmt.setInt(10, objBeanUsuario.getObjBeanTipoDocu().getIntIdTipoDocumento());		
			stmt.setInt(11, objBeanUsuario.getObjBeanEstado().getIntIdEstado());
			stmt.setInt(12, objBeanUsuario.getObjBeanTipoUsuario().getIntTipoUsuario());
			stmt.setInt(13, objBeanUsuario.getIntIdUsuario());
				
			int i = stmt.executeUpdate();
			
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return objBeanUsuario;
	}

	public Collection<BeanUsuario> listar() throws DAOExcepcion {
		Collection<BeanUsuario> listBeanUsuario = new ArrayList<BeanUsuario>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select * from tb_usuario order by nombreUsuario";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				BeanUsuario objBeanUsuario = new BeanUsuario();
				objBeanUsuario.setIntIdUsuario(rs.getInt("idUsuario"));
				objBeanUsuario.setStrNombreUsuario(rs.getString("nombreUsuario"));
				objBeanUsuario.setStrApePaterno(rs.getString("apePaterno"));
				objBeanUsuario.setStrApeMaterno(rs.getString("apeMaterno"));
				objBeanUsuario.setStrSexoUsuario(rs.getString("sexoUsuario"));
				objBeanUsuario.setStrNumDocuUsuario(rs.getString("numDocuUsuario"));
				objBeanUsuario.setStrTelefonoUsuario(rs.getString("telefonoUsuario"));
				objBeanUsuario.setStrDireccionUsuario(rs.getString("direccionUsuario"));
				objBeanUsuario.setStrEmailUsuario(rs.getString("emailUsuario"));
				objBeanUsuario.setStrPasswordUsuario(rs.getString("passwordUsuario"));
				
				//Declaramos una variable que reciba el codigo de tipo de documento
				Integer intIdTipoDocumento;
				//Seteamos la variable con lo recibido en la consulta
				intIdTipoDocumento = rs.getInt("idTipoDoc");
				//Creamos un objeto tipo BeanTipoDocumento 
				BeanTipoDocumento objBeanTipoDocumento= new BeanTipoDocumento();
				//Seteamos el idTipoDocumento dentro del objeto.
				objBeanTipoDocumento.setIntIdTipoDocumento(intIdTipoDocumento);
				//Seteamos el objeto para el objBeanUsuario
				objBeanUsuario.setObjBeanTipoDocu(objBeanTipoDocumento);
				
				//Declaramos una variable que reciba el codigo de estado
				Integer intIdEstado;
				//Seteamos la variable con lo recibido en la consulta
				intIdEstado = rs.getInt("idEstado");
				//Creamos un objeto tipo BeanEstado
				BeanEstado objBeanEstado= new BeanEstado();
				//Seteamos el idEstado dentro del objeto.
				objBeanEstado.setIntIdEstado(intIdEstado);
				//Seteamos el objeto para el objBeanUsuario
				objBeanUsuario.setObjBeanEstado(objBeanEstado);
				
				//Declaramos una variable que reciba el codigo de tipo usuario
				Integer intIdTipoUsuario;
				//Seteamos la variable con lo recibido en la consulta
				intIdTipoUsuario = rs.getInt("idTipoUsuario");
				//Creamos un objeto tipo BeanTipoUsuario
				BeanTipoUsuario objBeanTipoUsuario= new BeanTipoUsuario();
				//Seteamos el idTipoUsuario dentro del objeto.
				objBeanTipoUsuario.setIntTipoUsuario(intIdTipoUsuario);
				//Seteamos el objeto para el objBeanUsuario
				objBeanUsuario.setObjBeanTipoUsuario(objBeanTipoUsuario);
				listBeanUsuario.add(objBeanUsuario);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return listBeanUsuario;

	
	}
	
}
